package AnalizadorSemantico;

import AnalizadorLexico.CategoriaLexica;
import AnalizadorSintactico.PalabraReservada;

public class UtilidadesSemanticas implements PalabraReservada, CategoriaLexica {

	public static boolean correspondenciaTipos(String tipo1, String tipo2) {
		if (tipo1.equals(INT) && tipo2.equals(NUMENTERO)) {
			return true;
		}
		if (tipo2.equals(INT) && tipo1.equals(NUMENTERO)) {
			return true;
		}
		if (tipo1.equals(DOUBLE) && tipo2.equals(NUMREAL)) {
			return true;
		}
		if (tipo2.equals(DOUBLE) && tipo1.equals(NUMREAL)) {
			return true;
		}
		if (tipo1.equals(DOUBLE) && tipo2.equals(NUMENTERO)) {
			return true;
		}
		if (tipo2.equals(DOUBLE) && tipo1.equals(NUMENTERO)) {
			return true;
		}
		if (tipo1.equals(BOOL) && (tipo2.equals(TRUE) || tipo2.equals(FALSE))) {
			return true;
		}
		if (tipo2.equals(BOOL) && (tipo1.equals(TRUE) || tipo2.equals(FALSE))) {
			return true;
		}

		if (tipo1.equals(IDCLASE) && tipo2.equals(IDENTIFICADOR)) {
			return true;
		}
		if (tipo2.equals(IDCLASE) && tipo1.equals(IDENTIFICADOR)) {
			return true;
		}

		if (tipo1.equals(STRING) && tipo2.equals(CADENA)) {
			return true;
		}
		if (tipo2.equals(STRING) && tipo1.equals(CADENA)) {
			return true;
		}

		return false;
	}

	public static String mayorTipoResultante(String tipo1, String tipo2) {
		int precedencia2 = getPrecedencia(tipo2);
		int precedencia1 = getPrecedencia(tipo1);
		if (precedencia1 > precedencia2) {
			return tipo1;
		}
		if (precedencia1 < precedencia2) {
			return tipo2;
		}
		return tipo2;
	}

	private static int getPrecedencia(String tipo) {
		if (tipo.equals(NUMENTERO) || tipo.equals(INT)) {
			return 10;
		}
		if (tipo.equals(NUMREAL) || tipo.equals(DOUBLE)) {
			return 20;
		}
		if (tipo.equals(CADENA) || tipo.equals(STRING)) {
			return 30;
		}
		if (tipo.equals(IDCLASE)) {
			return 40;
		}
		return 0;
	}

	public static void main(String[] args) {
		System.out.println(mayorTipoResultante(NUMENTERO, NUMREAL));
	}

}
